#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
概率统计基础 - AI应用开发必备数学知识
重点：理解数据分布和统计概念，为机器学习打基础
"""

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号
print("📊 概率统计基础教学开始")
print("=" * 50)

# 1. 描述性统计
print("\n1. 描述性统计基础")
print("-" * 30)

# 创建示例数据
np.random.seed(42)  # 设置随机种子保证结果可重现
data = np.random.normal(170, 10, 1000)  # 1000个身高数据，均值170，标准差10

print(f"数据集大小: {len(data)}")
print(f"数据范围: {data.min():.2f} ~ {data.max():.2f}")
print(f"均值: {np.mean(data):.2f}")
print(f"中位数: {np.median(data):.2f}")
print(f"标准差: {np.std(data):.2f}")
print(f"方差: {np.var(data):.2f}")
print(f"四分位数: Q1={np.percentile(data, 25):.2f}, Q2={np.percentile(data, 50):.2f}, Q3={np.percentile(data, 75):.2f}")

# 2. 概率分布
print("\n\n2. 常见概率分布")
print("-" * 30)

# 正态分布
print("正态分布 (高斯分布)")
mu, sigma = 0, 1  # 均值和标准差
normal_data = np.random.normal(mu, sigma, 1000)
print(f"正态分布样本均值: {np.mean(normal_data):.3f}")
print(f"正态分布样本标准差: {np.std(normal_data):.3f}")

# 均匀分布
print("\n均匀分布")
uniform_data = np.random.uniform(0, 10, 1000)
print(f"均匀分布范围: {uniform_data.min():.2f} ~ {uniform_data.max():.2f}")

# 二项分布
print("\n二项分布")
binomial_data = np.random.binomial(10, 0.5, 1000)  # 10次试验，成功概率0.5
print(f"二项分布成功次数分布: {np.unique(binomial_data, return_counts=True)}")

# 3. 数据可视化
print("\n\n3. 数据可视化")
print("-" * 30)

fig = plt.figure(figsize=(15, 10))

# 子图1: 直方图
plt.subplot(2, 3, 1)
plt.hist(data, bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.axvline(np.mean(data), color='red', linestyle='--', label=f'均值: {np.mean(data):.1f}')
plt.axvline(np.median(data), color='green', linestyle='--', label=f'中位数: {np.median(data):.1f}')
plt.xlabel('身高 (cm)')
plt.ylabel('频数')
plt.title('身高分布直方图')
plt.legend()

# 子图2: 箱线图
plt.subplot(2, 3, 2)
plt.boxplot(data, vert=False)
plt.xlabel('身高 (cm)')
plt.title('箱线图')

# 子图3: 正态分布概率密度函数
plt.subplot(2, 3, 3)
x = np.linspace(-4, 4, 1    00)
y = stats.norm.pdf(x, 0, 1)
plt.plot(x, y, 'r-', linewidth=2)
plt.fill_between(x, y, alpha=0.3)
plt.xlabel('x')
plt.ylabel('概率密度')
plt.title('标准正态分布PDF')

# 子图4: 不同标准差的正态分布比较
plt.subplot(2, 3, 4)
x = np.linspace(-5, 5, 100)
for sigma in [0.5, 1, 2]:
    y = stats.norm.pdf(x, 0, sigma)
    plt.plot(x, y, label=f'σ={sigma}')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.title('不同标准差的正态分布')
plt.legend()

# 子图5: 累积分布函数
plt.subplot(2, 3, 5)
x = np.linspace(-4, 4, 100)
y_cdf = stats.norm.cdf(x, 0, 1)
plt.plot(x, y_cdf, 'b-', linewidth=2)
plt.xlabel('x')
plt.ylabel('累积概率')
plt.title('标准正态分布CDF')

# 子图6: QQ图（检验正态性）
plt.subplot(2, 3, 6)
stats.probplot(data, dist="norm", plot=plt)
plt.title('QQ图 - 正态性检验')

plt.tight_layout()
plt.savefig('statistics_visualization.png', dpi=300, bbox_inches='tight')
plt.show()

# 4. 相关性分析
print("\n\n4. 相关性分析")
print("-" * 30)

# 创建有相关性的数据
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = 2*x + np.random.normal(0, 0.5, 100)  # y与x有线性关系

correlation = np.corrcoef(x, y)[0, 1]
print(f"x和y的相关系数: {correlation:.3f}")

# 绘制散点图
plt.figure(figsize=(10, 8))

plt.subplot(2, 2, 1)
plt.scatter(x, y, alpha=0.6)
plt.xlabel('x')
plt.ylabel('y')
plt.title(f'散点图 (r={correlation:.3f})')

# 热力图
plt.subplot(2, 2, 2)
data_matrix = np.column_stack([x, y])
corr_matrix = np.corrcoef(data_matrix.T)
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', 
            xticklabels=['x', 'y'], yticklabels=['x', 'y'])
plt.title('相关系数热力图')

# 5. 假设检验
print("\n\n5. 假设检验基础")
print("-" * 30)

# t检验示例
sample1 = np.random.normal(100, 15, 30)  # 样本1
sample2 = np.random.normal(105, 15, 30)  # 样本2

t_stat, p_value = stats.ttest_ind(sample1, sample2)
print(f"t检验统计量: {t_stat:.3f}")
print(f"p值: {p_value:.3f}")
print(f"在0.05显著性水平下，两组数据均值{'有' if p_value < 0.05 else '没有'}显著差异")

# 绘制两组数据分布
plt.subplot(2, 2, 3)
plt.hist(sample1, alpha=0.7, label='样本1', bins=15)
plt.hist(sample2, alpha=0.7, label='样本2', bins=15)
plt.xlabel('数值')
plt.ylabel('频数')
plt.title('两组数据分布比较')
plt.legend()

# 6. 在机器学习中的应用
print("\n\n6. 机器学习中的应用示例")
print("-" * 30)

# 示例1: 数据标准化
print("示例1: 数据标准化 (Z-score标准化)")
original_data = np.array([150, 160, 170, 180, 190])
standardized_data = (original_data - np.mean(original_data)) / np.std(original_data)
print(f"原始数据: {original_data}")
print(f"标准化后: {standardized_data}")
print(f"标准化后均值: {np.mean(standardized_data):.2f}")
print(f"标准化后标准差: {np.std(standardized_data):.2f}")

# 示例2: 异常值检测
print("\n示例2: 基于正态分布的异常值检测")
test_data = np.array([165, 168, 172, 175, 178, 250])  # 最后一个可能是异常值
z_scores = np.abs(stats.zscore(test_data))
threshold = 2  # 阈值设为2倍标准差
outliers = test_data[z_scores > threshold]
print(f"测试数据: {test_data}")
print(f"Z分数: {z_scores}")
print(f"检测到的异常值: {outliers}")

plt.subplot(2, 2, 4)
plt.boxplot(test_data, vert=False)
plt.xlabel('数值')
plt.title('异常值检测 (箱线图)')

plt.tight_layout()
plt.show()

# 7. 实战练习
print("\n\n7. 实战练习")
print("-" * 30)

print("练习1: 计算描述性统计量")
exercise_data = np.array([23, 45, 67, 89, 12, 34, 56, 78, 90, 11])
print(f"数据: {exercise_data}")
print("请计算以下统计量:")
print("- 均值")
print("- 中位数") 
print("- 标准差")
print("- 方差")
print("验证你的答案:")
print(f"均值: {np.mean(exercise_data):.2f}")
print(f"中位数: {np.median(exercise_data):.2f}")
print(f"标准差: {np.std(exercise_data):.2f}")
print(f"方差: {np.var(exercise_data):.2f}")

print("\n练习2: 正态分布概率计算")
print("已知某考试分数服从正态分布N(75, 10^2)，求:")
print("- 分数超过85分的概率")
print("- 分数在65-85分之间的概率")
print("验证你的答案:")
prob_above_85 = 1 - stats.norm.cdf(85, 75, 10)
prob_between_65_85 = stats.norm.cdf(85, 75, 10) - stats.norm.cdf(65, 75, 10)
print(f"超过85分的概率: {prob_above_85:.3f}")
print(f"65-85分之间的概率: {prob_between_65_85:.3f}")

print("\n" + "=" * 50)
print("🎯 学习要点总结:")
print("1. 掌握描述性统计量的计算和意义")
print("2. 理解常见概率分布的特性")
print("3. 学会数据可视化和分布分析")
print("4. 了解相关性分析和假设检验")
print("5. 重点：数据分布的理解和统计推断")

print("\n💡 下一步学习:")
print("- 微积分概念（梯度、导数）")
print("- 机器学习基本概念")
print("- 在实际项目中应用统计知识")

print("\n📚 推荐资源:")
print("- 《统计学习方法》- 李航")
print("- Coursera: Statistics with Python")
print("- Kaggle: 数据分析入门竞赛")